package org.jsola.hr.service;

import org.jsola.admin.vo.HeaderFieldsVO;
import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IChildCompanyDAO;
import org.jsola.hr.dto.ChildCompanyAddDTO;
import org.jsola.hr.dto.ChildCompanyUpdateDTO;
import org.jsola.hr.dto.TypeAndId;
import org.jsola.hr.entity.ChildCompanyDO;
import org.jsola.hr.query.ChildCompanyQuery;
import org.jsola.hr.query.HrEmployeeSalaryNewQuery;
import org.jsola.hr.query.HrEmployeeSalaryQuery;
import org.jsola.hr.query.HrMonthlySalaryQuery;
import org.jsola.hr.vo.*;
import org.jsola.salary.vo.EmployeeDetailsNewVO;
import org.jsola.salary.vo.EmployeeDetailsVO;
import org.jsola.salary.vo.SalaryTemplateItemVO;
import org.jsola.user.core.TokenUser;

import java.util.List;
import java.util.Map;


/**
 * 用工单位分组
 *
 * @author zhr
 */
public interface IChildCompanyService extends IService<IChildCompanyDAO, ChildCompanyDO> {

    /**
     * 新增用工单位分组
     *
     * @param childCompanyAddDTO 新增用工单位分组DTO
     * @param tokenUser          当前用户
     * @return 用工单位分组详情信息
     */
    ChildCompanyVO save(ChildCompanyAddDTO childCompanyAddDTO, TokenUser tokenUser);

    /**
     * 新增用工单位分组和子公司关联信息
     *
     * @param childCompanyAddDTO 新增用工单位分组DTO
     * @param tokenUser          当前用户
     * @return 用工单位分组详情信息
     */
    ChildCompanyVO saveChildCompanyAndRelation(ChildCompanyAddDTO childCompanyAddDTO, TokenUser tokenUser);


    /**
     * 修改用工单位分组
     *
     * @param childCompanyUpdateDTO 修改用工单位分组DTO
     * @param tokenUser             当前用户
     * @return 更新数量
     */
    int update(ChildCompanyUpdateDTO childCompanyUpdateDTO, TokenUser tokenUser);

    /**
     * 修改用工单位分组和子公司关联信息
     *
     * @param childCompanyUpdateDTO 修改用工单位分组DTO
     * @param tokenUser             当前用户
     * @return 更新数量
     */
    int updateChildCompanyAndRelation(ChildCompanyUpdateDTO childCompanyUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除用工单位分组，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser       当前用户
     * @param childCompanyIds 用工单位分组id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... childCompanyIds);

    /**
     * 删除用工单位分组和子公司关联信息，物理删除，更新is_valid字段，从回收站删除
     *
     * @param childCompanyId 用工单位分组id
     * @param tokenUser      当前用户
     * @return 删除数量
     */
    int deleteChildCompanyAndRelation(String childCompanyId, TokenUser tokenUser);

    /**
     * 根据用工单位分组id查找
     *
     * @param childCompanyId 用工单位分组id
     * @param siteId         所属站点id
     * @return 用工单位分组详情信息
     */
    ChildCompanyVO selectById(String childCompanyId, String siteId);

    /**
     * 根据用工单位id查找,无站点
     *
     * @param childCompanyId 用工单位分组id
     * @return 用工单位分组详情信息
     */
    ChildCompanyDO selectDOByIdNotSite(String childCompanyId);

    /**
     * 根据用工单位分组id查找用工单位分组和子公司关联信息
     *
     * @param childCompanyId 用工单位分组id
     * @param siteId         所属站点id
     * @return 用工单位分组详情信息用工单位分组和子公司关联信息
     */
    ChildCompanyVO selectChildCompanyAndRelationById(String childCompanyId, String siteId);


    /**
     * 查询用工单位分组
     *
     * @param childCompanyQuery 查询条件
     * @param tokenUser         当前用户
     * @return 用工单位分组列表信息
     */
    List<ChildCompanyListVO> select(ChildCompanyQuery childCompanyQuery, TokenUser tokenUser);

    /**
     * 查询用工单位分组(返回过滤的)
     *
     * @param childCompanyQuery 查询条件
     * @param tokenUser         当前用户
     * @return 用工单位分组列表信息
     */
    List<ChildCompanyListVO> selectList(ChildCompanyQuery childCompanyQuery, TokenUser tokenUser);

    /**
     * 查询公司下用户有权限的用工单位树形结构
     *
     * @param userId 用户Id
     * @param siteId 公司id
     * @return 公司下用户有权限的用工单位树形结构
     */
    List<ChildCompanyListVO> selectTreeByUserId(String userId, String siteId);

    /**
     * 查询用户有的权限的用工单位
     *
     * @param userId 用户Id
     * @param siteId 站点Id
     * @return 用户有的权限的用工单位
     */
    UserCompanyVO selectByUserId(String userId, String siteId);


    /**
     * 查询公司下完整的用工单位树形结构
     *
     * @param siteId 公司Id
     * @return 公司下完整的用工单位树形结构
     */
    List<ChildCompanyListVO> selectAllTreeCompany(String siteId);

    /**
     * 查询根据上级公司查询用工单位分组
     *
     * @param companyId 公司id
     * @param siteId    所属站点id
     * @return 用工单位分组列表信息
     */
    List<ChildCompanyListVO> selectChildCompanyListByCompanyId(String companyId, String siteId);

    List<ChildCompanyListVO> addRelationToChildCompany(List<ChildCompanyListVO> childCompanyList, String siteId);

    /**
     * 查询用工单位分组记录数
     *
     * @param childCompanyQuery 查询条件
     * @param siteId            所属站点id
     * @return 用工单位分组记录数
     */
    int selectCount(ChildCompanyQuery childCompanyQuery, String siteId);

    /**
     * 分页查询用工单位分组
     *
     * @param childCompanyQuery 查询条件
     * @param siteId            所属站点id
     * @return 用工单位分组列表信息
     */
    Page<ChildCompanyListVO> selectPage(ChildCompanyQuery childCompanyQuery, String siteId);


    /**
     * 根据用工单位分组id查找
     *
     * @param childCompanyId 用工单位分组id
     * @param siteId         所属站点id
     * @return 用工单位分组
     */
    ChildCompanyDO selectDOById(String childCompanyId, String siteId);

    /**
     * 根据用工单位分组id查找
     *
     * @param childCompanyIds 用工单位分组id
     * @param tokenUser       当前用户
     * @return 用工单位分组详情信息
     */
    List<ChildCompanyDO> selectByIds(List<String> childCompanyIds, TokenUser tokenUser);

    /**
     * 查询用工单位分组
     *
     * @param childCompanyQuery 查询条件
     * @param siteId            所属站点id
     * @return 用工单位分组列表
     */
    List<ChildCompanyDO> selectDO(ChildCompanyQuery childCompanyQuery, String siteId);

    /**
     * 根据分公司id获取分公司信息
     *
     * @param idList 分公司ids
     * @param siteId 站点id
     * @return 分公司信息
     */
    List<ChildCompanyListVO> listByIdList(List<String> idList, String siteId);


    /**
     * 查询站点下的用工单位分组
     *
     * @param siteId 站点Id
     * @return 站点下的用工单位分组
     */
    List<ChildCompanyDO> selectBySiteId(String siteId);


    /**
     * 查询用工单位的客户明细
     *
     * @param hrMonthlySalaryQuery 用工单位查询条件
     * @param tokenUser            当前用户
     * @return 用工单位的客户明细
     */
    List<HrMonthlySalarySummaryVO> selectMonthlySalaryByCompanyList(HrMonthlySalaryQuery hrMonthlySalaryQuery, TokenUser tokenUser);

    List<HrMonthlySalarySummaryVO> selectMonthlySalaryByCompanyList2(HrMonthlySalaryQuery hrMonthlySalaryQuery, TokenUser tokenUser);



    Map<String, List<String>> filterCustomerDetailCompanyIds(TypeAndId type, UserCompanyVO userCompanyVO, String siteId);

    /**
     * 查询用工单位/分组的表头
     *
     * @param type      类型：用工单位/分组
     * @param id        Id
     * @param tokenUser 登录用户
     * @return 表头信息
     */
    List<SalaryTemplateItemVO> selectUsedTemplateByCompanyList(Integer yearly, Integer monthly
            , String type, String id, TokenUser tokenUser);

    /**
     * 查询员工的客户明细
     *
     * @param hrEmployeeSalaryQuery 查询条件
     * @param tokenUser             当前用户
     * @return 员工的客户明细
     */
    Page<EmployeeDetailsVO> selectEmployeeSalaryPageByCompanyIds(HrEmployeeSalaryQuery hrEmployeeSalaryQuery, TokenUser tokenUser);


//    /**
//     * 查询所有员工的客户明细
//     *
//     * @param hrEmployeeSalaryQuery 查询条件
//     * @param tokenUser             当前用户
//     * @return 员工的客户明细
//     */
//    List<EmployeeSalaryVO> selectEmployeeSalaryListByTypeAndId(HrEmployeeSalaryQuery hrEmployeeSalaryQuery, TokenUser tokenUser);
//
//    /**
//     * 查询公司下所有员工的客户明细
//     *
//     * @param yearly              年
//     * @param monthly             月
//     * @param nameOrPhoneOrIdCard 指定姓名/手机号/身份证 没有为null
//     * @param empStatus           员工状态 没有为在职
//     * @param companyIds          公司Ids
//     * @param tokenUser           当前用户
//     * @return 员工的客户明细
//     */
//    List<EmployeeSalaryVO> selectEmployeeSalaryListByCompanyIds(Integer yearly, Integer monthly
//            , String nameOrPhoneOrIdCard, Integer empStatus, List<String> companyIds, TokenUser tokenUser);

    /**
     * 导出客户明细表
     *
     * @param hrEmployeeSalaryQuery 查询对象
     * @param tokenUser             当前用户
     * @return excel本地路径
     */
    String exportExcel(HrEmployeeSalaryQuery hrEmployeeSalaryQuery, TokenUser tokenUser);


    /**
     * 查询客户明细表头
     *
     * @param subjectType        业务类型
     * @param subjectId          业务Id
     * @param customerDetailsIds 客户明细Ids
     * @param yearly             年
     * @param monthly            月
     * @param tokenUser          登录用户
     * @return 客户明细表头
     */
    HeaderFieldsVO selectHeaderDetail(String subjectType, String subjectId, List<Long> customerDetailsIds
            , Integer yearly, Integer monthly, TokenUser tokenUser);


    /**
     * 查询租户下用工单位分组 返回完整的树形 字段来判断是否有权限
     *
     * @param childCompanyQuery 查询条件
     * @param tokenUser         登录用户
     * @return 完整的树形 字段来判断是否有权限
     */
    List<ChildCompanyVO> tree(ChildCompanyQuery childCompanyQuery, TokenUser tokenUser);

    /**
     * 根据groupIds,递归查询整个分组树
     *
     * @param groupIds
     * @param siteId
     * @return
     */
    List<ChildCompanyDO> groupTree(List<String> groupIds, String siteId);

    /**
     * 递归查询父分组下的所有子分组
     *
     * @param groupIds
     * @param siteId
     * @return
     */
    List<String> groupTreeIds(List<String> groupIds, String siteId);

    ChildCompanyDO selectByName(String s, TokenUser tokenUser);
}


